/**
 * 时间处理接口
 */
export class TimeUtils {
    static convertDateFromString(dateString: string) : string | undefined {
        if (dateString) {
            const arr1 = dateString.split(' ');
            const sdate = arr1[0].split('-');
            const date = new Date(Number(sdate[0]), Number(sdate[1]) - 1, Number(sdate[2])).toDateString();
            return date;
        }
        return undefined;
    }

    static format2Digits(data: any) {
        return ('0' + data).slice(-2);
    }

    private static weekArray = ['周天', '周一', '周二', '周三', '周四', '周五', '周六'];
    private static minute = 1000 * 60;
    private static hour = TimeUtils.minute * 60;
    private static day = TimeUtils.hour * 24;
    private static week = TimeUtils.day * 7;
    private static month = TimeUtils.day * 30;

    static parseChatTime(numberTime: number) {
        const nowDate = new Date();
        const disDate = new Date(numberTime);
        const nowTime = nowDate.getTime(); // 当前的时间戳
        const distTime = disDate.getTime(); // 指定时间的时间戳
        const diffTime = nowTime - distTime;

        let result: string;
        if (diffTime < 0) {
            console.warn('设置的时间不能早于当前时间！');
        } else if (disDate.getFullYear() < nowDate.getFullYear()) {
            // @ts-ignore
            result = TimeUtils.formatDate(disDate, 'yyyy-MM-dd');
        } else if (diffTime / TimeUtils.month >= 1) {
            // result = parseInt(diffTime / month) + '月前';
            result = (disDate.getMonth() + 1) + '月' + disDate.getDate() + '日';
        } else if (diffTime / TimeUtils.week >= 1) {
            // 周前
            result = (disDate.getMonth() + 1) + '月' + disDate.getDate() + '日';
        } else if (diffTime / TimeUtils.day >= 1) {
            // result = parseInt(diffTime / day) + '天前！';
            result = TimeUtils.weekArray[disDate.getDay()];
        } else if (diffTime / TimeUtils.hour >= 1) {
            // result = parseInt(diffTime / hour) + '小时前！';
            result = TimeUtils.format2Digits(disDate.getHours()) + ':' + TimeUtils.format2Digits(disDate.getMinutes());
        } else if (diffTime / TimeUtils.minute >= 1) {
            // result = parseInt(diffTime / minute) + '分钟';
            result = TimeUtils.format2Digits(disDate.getHours()) + ':' + TimeUtils.format2Digits(disDate.getMinutes());
        } else {
            result = '刚刚';
        }
        // @ts-ignore
        return result;
    }

    /**
     * 格式化会话列表，时间显示样式
     * @param stringTime
     */
    static parseConversationTime(stringTime: string) {
        const nowDate = new Date();
        const disDate = new Date(stringTime);
        const nowTime = nowDate.getTime(); // 当前的时间戳
        const distTime = disDate.getTime(); // 指定时间的时间戳
        const diffTime = nowTime - distTime;

        let result: string;
        if (diffTime < 0) {
            console.warn('设置的时间不能早于当前时间！');
        } else if (diffTime / TimeUtils.day >= 1) {
            // @ts-ignore
            result = distTime.format('yyyy/MM/dd');
        } else {
            result = TimeUtils.format2Digits(disDate.getHours()) + ':' + TimeUtils.format2Digits(disDate.getMinutes());
        }
        // @ts-ignore
        return result;
    }

    /**
     * 判断当前日前是不是今天
     * @param numberTime
     */
    static isToday(numberTime: number): boolean {
        const today = new Date();
        const test = new Date(numberTime);
        return today.getFullYear() === test.getFullYear() &&
            today.getMonth() === test.getMonth() && today.getDate() === test.getDate();
    }

    /**
     * 判断当前时间是否是昨天
     * @param numberTime
     */
    static isYesterday(numberTime: number): boolean {
        const today = new Date();
        const yesterday = new Date(today.getTime() - 86400000);//1000 * 60 * 60 * 24=86400000
        const test = new Date(numberTime);

        return yesterday.getFullYear() === test.getFullYear() &&
            yesterday.getMonth() === test.getMonth() && yesterday.getDate() === test.getDate();
    }

    /**
     * 判断时间是否是两分钟以内
     * @param numberTime
     */
    static in2Minute(numberTime: number): boolean {
        const today = new Date().getTime();
        // 1000 * 60 * 2 = 120000
        return today - numberTime <= 120000;
    }

    /**
     * 判断当前时间是否是一周以内的
     * @param numberTime
     */
    static inWeekDay(numberTime: number): boolean {
        const today = new Date().setHours(0,0,0,0);
        const test  = new Date(numberTime).setHours(0,0,0,0,);
        // 1000 * 60 * 60 * 24=86400000 == 24小时
        // 一周就是7 个 24小时 为： 2073600000
        return today - test <= 2073600000;
    }

    /**
     * 判断给出的时间，是否是同一年的
     * @param numberTime
     */
    static inYearDay(numberTime: number): boolean {
        const today = new Date();
        const test  = new Date(numberTime);
        return today.getFullYear() === test.getFullYear();
    }

    /**
     * 根据当前某条消息记录，与上条消息记录相差时间大于某个值而显示当前消息的时间
     *
     * @param numberTime
     */
    static parseMessageDisplayShowTime(numberTime: number): string {
        const sendDate = new Date(numberTime);
        if (this.isToday(numberTime)) {
            return this.format2Digits(sendDate.getHours()) + ':' + this.format2Digits(sendDate.getMinutes());
        } else if (this.isYesterday(numberTime)) {
            return '昨天 ' + this.format2Digits(sendDate.getHours()) + ':' + this.format2Digits(sendDate.getMinutes());
        } else if (this.inWeekDay(numberTime)) {
            return '周' + '日一二三四五六'.charAt(sendDate.getDay()) +' '+ this.format2Digits(sendDate.getHours()) + ':' + this.format2Digits(sendDate.getMinutes());
        } else if (this.inYearDay(numberTime)) {
            return sendDate.getMonth() + '月' + sendDate.getDate() + '日' +' '+ this.format2Digits(sendDate.getHours()) + ':' + this.format2Digits(sendDate.getMinutes());
        } else {
            return sendDate.getFullYear() + '年' + sendDate.getMonth() + '月' + sendDate.getDate() + "日 "+ this.format2Digits(sendDate.getHours()) + ':' + this.format2Digits(sendDate.getMinutes());
        }
    }

    /**
     *  对Date的扩展，将 Date 转化为指定格式的String
     *  月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
     *  年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
     *  例子：
     *  (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
     *  (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
     * @param date
     * @param fmt
     */
    static formatDate(date: Date, fmt: string) : string {
        // author: meizz
        const o = {
            'M+': date.getMonth() + 1, // 月份
            'd+': date.getDate(), // 日
            'h+': date.getHours(), // 小时
            'm+': date.getMinutes(), // 分
            's+': date.getSeconds(), // 秒
            'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
            S: date.getMilliseconds() // 毫秒
        };
        if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); }
        for (const k in o) {
            //@ts-ignore
            if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))); }
        }
        return fmt;
    }
    /**
     * 根据请假时间来计算时长
     * 1000 * 60 * 60 * 24=86400000 == 24小时
     * @param startTime 请假开始时间，单位毫秒
     * @param endTime 请假结束时间，单位毫秒
     */
    static parseApplyTime(startTime: number, endTime: number) {
        if(startTime && endTime && endTime > startTime) {
            let subtract = endTime - startTime;
            return subtract < TimeUtils.day ? (subtract / TimeUtils.hour).toFixed(2) + '小时' :
                (subtract / TimeUtils.day).toFixed(2) + '天';
        }
        return undefined;
    }
    /**
     * 去掉秒
     * @param time 完整的2019-01-02 08:00:00时间
     * @param index
     */
    static formatTime(time: string, index=0) {
        if (time) {
            var str = time.substring(index, time.length - 3);
            var str = str.replace("-", ".");
            return str.replace("-", ".");
        }
        return ""
    }
    /**
     * 判断时间是不是属于过去
     * @param time 过去时间
     */
    static isPastTime(time: number) {
        let old = new Date(time).getTime();
        return old < new Date().getTime();
    }

    /**
     * 获取当前年
     */
    static getCurrentYear(): number {
        const today = new Date();
        return today.getFullYear();
    }
}
